<?php

namespace Common\Model;

use Think\Log;
use Think\Model;

/**
 * 用户收藏文档的关联模型
 */
class UserDocModel extends Model {

    const NORMAL = 0;       // 状态：正常状态
    const DELETE = -1;      // 状态：删除状态

    const USER_DOC_KEY = 'userdoc:';    // 用户收藏文档缓存键名

    /**
     * 新增用户收藏文档关系数据
     * @param $uid
     * @param $did
     * @return mixed
     */
    public static function addData($uid, $did){
        $data = [
            'uid' => $uid,
            'did' => $did
        ];
        if($id = M('UserDoc')->add($data)){
            self::clearCache($uid);
        }
        return $id;
    }

    /**
     * 获取用户收藏的文档ID列表数组，如：[1,2,3]
     * @param $uid
     * @return array|null
     */
    public static function getUserDocsId($uid){
        $key = self::USER_DOC_KEY.$uid;
        $result = S($key);
        if(false === $result){
            $result = M('UserDoc')->where(['uid' => $uid, 'status' => self::NORMAL])->field('did')->select();
            if(false !== $result){
                S($key, is_null($result) ? [] : $result);
            }
        }
        if(!$result){
            return null;
        }
        $arr = [];
        foreach($result as $v){
            $arr[] = $v['did'];
        }
        return $arr;
    }

    /**
     * 分页获取用户收藏的文档信息
     * @param $uid
     * @param $p
     * @param $pcount
     * @param $all
     * @return array|null
     */
    public static function getUserDocsInfo($uid, $p, $pcount, $all = true){
        $allDids = self::getUserDocsId($uid);
        $dids = array_slice($allDids, ($p - 1) * $pcount, $pcount);
        if(!$dids){
            return null;
        }
        $result = [];
        foreach ($dids as $v) {
            $result[] = DocModel::getDocById($v, $all);
        }
        return $result;
    }

    /**
     * 检测用户是否已经收藏该文档
     * @param $uid
     * @param $did
     * @return bool
     */
    public static function checkCollected($uid, $did){
        $collectArr = self::getUserDocsId($uid);
        return $collectArr ? in_array($did, $collectArr) : false;
    }

    /**
     * 获取用户收藏的文档数量
     * @param $uid
     * @return int
     */
    public static function getCollectedCount($uid){
        $dids = self::getUserDocsId($uid);
        return $dids ? count($dids) : 0;
    }

    /**
     * 用户收藏文档
     * @param $uid
     * @param $doc
     * @return bool
     */
    public static function collect($uid, $doc){
        $model = M();
        $model->startTrans();
        // 先减少用户的贡献度
        if(!UserModel::updateGx($uid, 1, false)){
            $model->rollback();
            return false;
        }
        // 然后添加用户文档关系
        if(!self::addData($uid, $doc['id'])){
            $model->rollback();
            return false;
        }
        // 再更新文档的收藏数
        if(!DocCountModel::update($doc['id'], 'collect')){
            $model->rollback();
            return false;
        }
        // 再更新社区或个人的贡献度
        if ($doc['bid']) {
            if(!BbsModel::updateGx($doc['bid'])){
                $model->rollback();
                return false;
            }
        } else {
            if(!UserModel::updateGx($doc['uid'])){
                $model->rollback();
                return false;
            }
        }
        if (!LogModel::userCollectDoc($uid, $doc)) {
            $model->rollback();
            return false;
        }
        $model->commit();
        return true;
    }

    /**
     * 用户取消收藏文档
     * @param $uid
     * @param $did
     * @return bool
     */
    public static function cancelCollect($uid, $did){
        $where = [
            'uid' => $uid,
            'did' => $did,
            'status' => self::NORMAL
        ];
        $model = M();
        $model->startTrans();
        // 先删除用户收藏文档记录
        if(!M('UserDoc')->where($where)->setField('status', self::DELETE)){
            $model->rollback();
            return false;
        }
        // 再更新文档收藏数
        if(!DocCountModel::update($did, 'collect', false)){
            $model->rollback();
            return false;
        }
        $model->commit();
        // 然后清空用户文档缓存
        self::clearCache($uid);
        return true;
    }

    /**
     * 用户捐赠社区
     * @param $uid
     * @param $doc
     * @param $gx
     * @return bool
     */
    public static function donation($uid, $doc, $gx){
        $model = M();
        $model->startTrans();
        // 先减少用户的贡献度
        if(!UserModel::updateGx($uid, $gx, false)){
            $model->rollback();
            return false;
        }
        // 再更新社区或个人的贡献度
        if ($doc['bid']) {
            if(!BbsModel::updateGx($doc['bid'], $gx)){
                $model->rollback();
                return false;
            }
        } else {
            if(!UserModel::updateGx($doc['uid'], $gx)){
                $model->rollback();
                return false;
            }
        }
        if (!LogModel::userDonateDoc($uid, $gx, $doc)) {
            $model->rollback();
            return false;
        }
        $model->commit();
        return true;

    }

    /**
     * 检测用户是否拥有文档的超级管理权限（私有文档的拥有者或公有文档所在团体的主席）
     * @param $uid
     * @param $doc
     * @param null $super 为null表示所有，为true表示主席，false表示理事
     * @return bool
     */
    public static function checkManager($uid, $doc, $super = null)
    {
        return $doc['bid'] ? UserOrgModel::checkManager(UID, $doc['bid'], $super) : $uid == $doc['uid'];
    }

    /**
     * 获取文档的所有关注次数
     * @param $did
     * @return mixed
     */
    public static function getDocCollectedCount($did){
        return M('UserDoc')->where(['did' => $did])->count();
    }

    /**
     * 检查用户对文档的编辑权限
     * @param $uid
     * @param $doc
     * @return bool
     */
    public static function checkEditAuth($uid, $doc) {
        if ($doc['status'] == DocModel::DELTEL) {
            return false;
        }
        if (self::checkManager($uid, $doc)) {
            return true;
        } else {
            if ($doc['status'] == DocModel::HIDDEN ) {
                return false;
            } else {
                if ($doc['can_edit'] == DocModel::CAN_EDIT) {
                    return true;
                }
                return false;
            }
        }
    }

    public static function clearCache($uid){
        $key = self::USER_DOC_KEY.$uid;
        S($key, null);
    }

}